#include <stm32f10x_rcc.h>
#include <stm32f10x_gpio.h>
// #include <stm32f10x_conf.h> // 万能头文件

#include "led.h"
#include "bitband.h"

#define RCC_BASE_ADDR 0x40021000
#define GPIOC_BASE_ADDR 0x40011000
#define RCC_APB2_CLOCK_ENB_ADDR *(unsigned int *)((RCC_BASE_ADDR) + 0x18) 
#define GPIOC_CRL_ADDR *(unsigned int *)((GPIOC_BASE_ADDR) + 0x00)
#define GPIOC_ODR_ADDR2 *(unsigned int *)((GPIOC_BASE_ADDR) + 0x0c)



void led_init(void)
{
	GPIO_InitTypeDef c_init;
	
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	
	/*  GPIO PC1 PC2 PC3  */ 
	c_init.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; // 选择引脚 1 2 3 
	c_init.GPIO_Speed = GPIO_Speed_50MHz;					// 设置速度 50MHz
	c_init.GPIO_Mode = GPIO_Mode_Out_PP; 					// 设置输出模式为推挽输出
	GPIO_Init(GPIOC, &c_init);

}

void led_on(int num)
{
	switch (num) {
		case 0:
			// GPIO_SetBits(GPIOC, GPIO_Pin_1);
			PCOut(1) = 1;
			break;
		case 1:
			// GPIO_SetBits(GPIOC, GPIO_Pin_2);
			PCOut(2) = 1;
			break;
		case 2:
			// GPIO_SetBits(GPIOC, GPIO_Pin_3);
			PCOut(3) = 1;
			break;
		default:
			break;
	}
}

void led_off(int num)
{
	switch (num) {
		case 0:
			// GPIO_ResetBits(GPIOC, GPIO_Pin_1);
			PCOut(1) = 0;
			break;
		case 1:
			// GPIO_ResetBits(GPIOC, GPIO_Pin_2);
			PCOut(2) = 0;
			break;
		case 2:
			// GPIO_ResetBits(GPIOC, GPIO_Pin_3);
			PCOut(3) = 0;
			break;
		default:
			break;
	}
}



void led_register_init(void)
{
	/* bit4 置 1 IO端口C时钟使能开启 */
	RCC_APB2_CLOCK_ENB_ADDR = RCC_APB2_CLOCK_ENB_ADDR | (1u << 4);
	
	/* 端口配置低寄存器（GPIOx_CRL）：用于配置引脚0到7的功能和参数。每个引脚对应4个寄存器位 */
	/* 端口配置高寄存器（GPIOx_CRH）：用于配置引脚8到15的功能和参数。每个引脚对应4个寄存器位 */
	/* 将PC1 PC2 PC3设置为推挽输出模式，四个寄存器位设置为：0011 */ 
	GPIOC_CRL_ADDR = GPIOC_CRL_ADDR & ~(0xF << 4); 		// PC1
	GPIOC_CRL_ADDR = GPIOC_CRL_ADDR | (0x3 << 4);
	
	GPIOC_CRL_ADDR = GPIOC_CRL_ADDR & ~(0xF << 2 * 4); 	// PC2
	GPIOC_CRL_ADDR = GPIOC_CRL_ADDR | (0x3 << 2 * 4);
	
	GPIOC_CRL_ADDR = GPIOC_CRL_ADDR & ~(0xF << 3 * 4);	// PC3
	GPIOC_CRL_ADDR = GPIOC_CRL_ADDR | (0x3 << 3 * 4);
	
}

void led_register_on(int num)	
{
	switch (num) {
		case 0:
			GPIOC_ODR_ADDR2 |= 0x1 << 1; 
			break;
		case 1:
			GPIOC_ODR_ADDR2 |= 0x1 << 2; 
			break;
		case 2:
			GPIOC_ODR_ADDR2 |= 0x1 << 3; 
			break;
		default:
			break;
	}
}

void led_register_off(int num)
{
	switch (num) {
		case 0:
			GPIOC_ODR_ADDR2 &= ~(0x1 << 1); 
			break;
		case 1:
			GPIOC_ODR_ADDR2 &= ~(0x1 << 2); 
			break;
		case 2:
			GPIOC_ODR_ADDR2 &= ~(0x1 << 3); 
			break;
		default:
			break;
	}
}


